package com.atwulidun.decorator07;

public class Decorator extends Drink {
    // 装饰者模式：继承Drink同时拥有Drink的一个对象
    private Drink drink;

    public Decorator(Drink drink) {
        this.drink = drink;
    }

    @Override
    public int cost() {
        // 注意：这里的费用是调味品本身的费用加上咖啡的费用
        return getPrice() + drink.cost();
    }

    // 特别注意：以下这种写法是有问题的：
    // new Milk(drink)时调用了setDes("牛奶");则des=="牛奶"，那么return中的getDes()按理说应该返回"牛奶"
    // 但实际上是getDes()调用了21行的自己，进入一个重复自我调用的死循环中
    // 因此需要改进：把属性des变成public的，最重要的是setDes方法，每包装一层都要对des进行更新！！！！！！
//    @Override
//    public String getDes() {
//        return (drink.getDes() + "加一份" + getPrice() + "元" + getDes());
//    }
    @Override
    public String getDes() {
        // 首先对des重新设置
        setDes(drink.des + "加一份" + getPrice() + "元" + des);
        // 然后再返回重新设置好的des即可
        return des;
    }
}

// 以下为各种调味品类
class Milk extends Decorator {
    public Milk(Drink drink) {
        super(drink);
        // 设置调味品的描述和价格
        setDes("牛奶");
        setPrice(5);
    }
}
class Sugar extends Decorator {
    public Sugar(Drink drink) {
        super(drink);
        // 设置调味品的描述和价格
        setDes("糖");
        setPrice(4);
    }
}
class Soy extends Decorator {
    public Soy(Drink drink) {
        super(drink);
        // 设置调味品的描述和价格
        setDes("豆浆");
        setPrice(3);
    }
}
